// /src/utils/request.js
const VITE_APP_PROXY_URL = import.meta.env.VITE_APP_PROXY_URL;
const VITE_APP_BASE_URL = import.meta.env.VITE_APP_BASE_URL; // 接口基础URL

const base_config = {
  url: "",
  method: "GET",
  dataType: "json",
  timeout: 6000,
  data: {},
  header: {
    "Content-Type": "application/json;charset=UTF-8",
  },
};

import axios from "./axios";

const request: any = axios(base_config);

//  请求拦截器
request.interceptor.request = (options: any) => {

  const timeout: any = Date.now();
  let url: string = options.url || "";
  // url 拼接 - 为请求加上时间戳
  if (!/^(http | https)/.test(url)) {
    //  判断他是不是一个完整的地址， 如果不是则进行拼接

    //  判断 当前的options.url 是否有参数， 并给其结尾添加上时间戳，避免请求未发出
    if (url.includes("?")) {
      url += `&timeout=${timeout}`;
    } else {
      url += `?timeout=${timeout}`;
    }

    options.url = VITE_APP_PROXY_URL + VITE_APP_BASE_URL + url;
  }

  //  对请求方式进行加工
  options.method = options.method?.toUpperCase();

  const token = uni.getStorageSync("token");

  // 添加请求头、身份验证等
  if (token) {
    Object.assign(options.header, { token });
  } else {
    //  token 不存在， 跳转回 登录页
    warnToast("登录失败", 1500);
    backToLogin();
    return;
  }

  //  返回加工后的结果
  return options;
};

//  响应拦截器
request.interceptor.response = (res: any) => {

  const { statusCode, data } = res;
  if ((statusCode >= 200 && statusCode < 300) || statusCode === 304) {
    //  判断当前返回值有没有 token
    const { error, token } = data;

    //  有 token 说明当前是登录状态 - 重新设置token
    if (token) uni.setStorageSync("token", token);

    return data;

  } else {
    uni.clearStorageSync();
    if (statusCode === 401 || statusCode === 403) {
      //  token 过期 - 返回到登录页
      backToLogin();
    } else {
      //  网络错误
      warnToast("网络错误");
    }
  }
};

//  返回登录页
export function backToLogin() {
  uni.showLoading({
    title: '加载中...'
  });
  
  uni.redirectTo({ url: "/pages/Login/index" });
}

export function successToast(text: string = "", delay: number = 1500) {
  uni.showToast({
    title: text,
    mask: true,
    //将值设置为 success 或者直接不用写icon这个参数
    icon: "success",
    //显示持续时间为 2秒
    duration: delay,
  });
}

export function warnToast(text: string = "", delay: number = 1500) {
  uni.showToast({
    title: text,
    mask: true,
    //将值设置为 success 或者直接不用写icon这个参数
    icon: "error",
    //显示持续时间为 2秒
    duration: delay,
  });
}

export default request;